
package controleur;

import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import modele.*;
import modele.exceptions.*;

/**
 *
 * @author Danicela
 */
public class Controleur extends HttpServlet {
   
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");

        //Aiguilleur

        String action = request.getParameter("action");
        String forward = null;
        try {

            if (action == null) {
                if (request.getSession().getAttribute("idUser") == null) //Si on vient d'arriver et qu'on n'est pas connecté, afficher l'authentification
                {
                    forward = "VueAuthentification";
                } else //Si on est déjà connecté, afficher la page principale
                {
                    forward = menu(request);
                }
            } else if (action.equals("authentification")) //Si on a saisi un login mdp pour s'authentifier
            {
                forward = authentification(request);
            } else if (request.getSession().getAttribute("idUser") == null) //Si on n'est pas connecté
            {
                forward = "VueAuthentification";
            } else if (action.equals("menu"))
            {
                forward = menu(request);
            }else if (action.equals("voir_echantillon"))
            {
                forward = echantillon(request);
            } else if(action.equals("voirResultats"))
            {
                forward = resultats(request);
            } else if(action.equals("ajouterResultat"))
            {
                forward = ajouterResultat(request);
            }
            else if(action.equals("enregistrerResultat"))
            {
                forward = enregistrerResultat(request);
            } else if(action.equals("nouveau_echantillon"))
            {
                forward = "VueEnregistrerEchantillon";
            }
            else if(action.equals("enregistrerEchantillon"))
            {
                forward = enregistrerEchantillon(request);
            }
            else if(action.equals("detruire_echantillon"))
            {
                forward = detruireEchantillon(request);
            }
            else if(action.equals("historique_action"))
            {
                forward = historique(request);
            }
            else if(action.equals("voir_analyse"))
            {
                forward = analyse(request);
            }
            else if(action.equals("nouvelle_analyse"))
            {
                forward = "VueEnregistrerAnalyse";
            }
            else if(action.equals("enregistrerAnalyse"))
            {
                forward = enregistrerAnalyse(request);
            }
            else //Si l'action est inconnue
            {
                forward = erreur(request);
            }
        } catch (Exception e) {
            forward = erreur(request);
            request.setAttribute("erreur", "Erreur.");
        }

        request.getRequestDispatcher(forward + ".jsp").forward(request, response);

    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private String authentification(HttpServletRequest request)
    {
        String forward = "VueAuthentification";
        String login = request.getParameter("login");
        String mdp = request.getParameter("pass");

        try
        {
            Utilisateur identifie = Utilisateur.getUtilisateur(login, mdp);
            request.getSession().setAttribute("idUser", identifie.getId());
            forward = menu(request);
        }
        catch(UtilisateurInexistantException e)
        {
            request.setAttribute("erreur", "Login ou mot de passe incorrect.");
        }
        catch(SQLException e)
        {
            request.setAttribute("erreur", "Erreur de la base de données");
        }

        return forward;

    }

    private String menu(HttpServletRequest request)
    {
        String forward = "VueMenu";

        int idUser = (Integer) request.getSession().getAttribute("idUser");
        try
        {
            Utilisateur identifie = Utilisateur.getUtilisateur(idUser);
            if(identifie.getType() == 1)
                request.setAttribute("role", "chefdelabo");
            else
                request.setAttribute("role", "technicien");
        }
        catch(UtilisateurInexistantException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "L'utilisateur identifié n'existe pas.");
        }
        catch(SQLException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Erreur de la base de données");
        }

        return forward;

    }

    private String echantillon(HttpServletRequest request)
    {
        String forward = "VueEchantillon";

        int idUser = (Integer) request.getSession().getAttribute("idUser");
        try
        {
            Utilisateur identifie = Utilisateur.getUtilisateur(idUser);
            if(identifie.getType() == 1)
                request.setAttribute("role", "chefdelabo");
            else
                request.setAttribute("role", "technicien");

            request.setAttribute("echantillons", Echantillon.getTousLesEchantillons());
        }
        catch(UtilisateurInexistantException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "L'utilisateur identifié n'existe pas.");
        }
        catch(SQLException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Erreur de la base de données");
        }

        return forward;

    }

    private String resultats(HttpServletRequest request)
    {
        String forward = "VueResultat";


        String idEchantillonString = (String) request.getParameter("idEchantillon");
        int idEchantillon = Integer.parseInt(idEchantillonString);
        try
        {
            request.setAttribute("echantillon", Echantillon.getEchantillon(idEchantillon));
            request.setAttribute("resultats", Echantillon.getResultats(idEchantillon));
        }
        catch(EchantillonInexistantException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", e.toString());
        }
        catch(SQLException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Erreur de la base de données");
        }

        return forward;

    }

    private String ajouterResultat(HttpServletRequest request)
    {
        String forward = "VueEnregistrerResultat";

        String idEchantillonString = (String) request.getParameter("idEchantillon");
        int idEchantillon = Integer.parseInt(idEchantillonString);
        try
        {
            request.setAttribute("echantillon", Echantillon.getEchantillon(idEchantillon));
            request.setAttribute("analyses", Analyse.getToutesLesAnalyses());
        }
        catch(EchantillonInexistantException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", e.toString());
        }
        catch(SQLException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Erreur de la base de données");
        }

        return forward;

    }

    private String enregistrerResultat(HttpServletRequest request)
    {
        String forward = null;

        String texte = (String) request.getParameter("texte");      

        String idEchantillonString = (String) request.getParameter("idEchantillon");
        int idEchantillon = Integer.parseInt(idEchantillonString);

        String idAnalyseString = (String) request.getParameter("idAnalyse");
        int idAnalyse = Integer.parseInt(idAnalyseString);

        try
        {
            String dateString = (String) request.getParameter("date");
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            Date date = sdf.parse(dateString);

            Echantillon e = Echantillon.getEchantillon(idEchantillon);
            Analyse a = Analyse.getAnalyse(idAnalyse);
            int idUser = (Integer) request.getSession().getAttribute("idUser");

            Resultat.enregistrerNouveauResultat(date, texte, idEchantillon, idAnalyse);
            Action.enregistrerNouvelleAction(new Date(), "Ajout d'un résultat pour l'analyse " + a.getIdentifiant(), e.getIdentifiant(), idUser);

            forward = echantillon(request);
        }
        catch(EchantillonInexistantException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", e.toString());
        }
        catch(AnalyseInexistanteException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", e.toString());
        }
        catch(ParseException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Format de la date incorrecte : jj/mm/yy");
        }
        catch(SQLException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Erreur de la base de données");
        }

        return forward;

    }

    private String enregistrerEchantillon(HttpServletRequest request)
    {
        String forward = null;

        String lieu = (String) request.getParameter("lieu");
        String identifiant = (String) request.getParameter("identifiant");
        String statut = (String) request.getParameter("statut");

        try
        {
            int idUser = (Integer) request.getSession().getAttribute("idUser");

            String dateString = (String) request.getParameter("date");
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            Date date = sdf.parse(dateString);

            Echantillon.enregistrerNouvelEchantillon(lieu, identifiant, statut, date);
            Action.enregistrerNouvelleAction(new Date(), "Enregistrement d'un nouvel échantillon", identifiant, idUser);

            forward = echantillon(request);
        }
        catch(ParseException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Format de la date incorrecte : jj/mm/yy");
        }
        catch(SQLException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Erreur de la base de données");
        }

        return forward;

    }

    private String detruireEchantillon(HttpServletRequest request)
    {
        String forward = null;

        String idEchantillonString = (String) request.getParameter("idEchantillon");
        int idEchantillon = Integer.parseInt(idEchantillonString);

        try
        {
            int idUser = (Integer) request.getSession().getAttribute("idUser");
            Utilisateur user = Utilisateur.getUtilisateur(idUser);
            if(user.getType() != 1)
                throw new PasLeDroitException();

            Echantillon e = Echantillon.getEchantillon(idEchantillon);

            Echantillon.supprimerEchantillon(idEchantillon);
            Action.enregistrerNouvelleAction(new Date(), "Destruction de l'échantillon", e.getIdentifiant(), idUser);


            forward = echantillon(request);
        }
        catch(UtilisateurInexistantException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "L'utilisateur identifié n'existe pas.");
        }
        catch(PasLeDroitException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", e.toString());
        }
        catch(EchantillonInexistantException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", e.toString());
        }
        catch(SQLException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Erreur de la base de données");
        }

        return forward;

    }

    private String historique(HttpServletRequest request)
    {
        String forward = "VueHistorique";

        try
        {
            int idUser = (Integer) request.getSession().getAttribute("idUser");
            Utilisateur user = Utilisateur.getUtilisateur(idUser);
            if(user.getType() != 1)
                throw new PasLeDroitException();

            request.setAttribute("actions", Action.getToutesLesActions());

        }
        catch(UtilisateurInexistantException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "L'utilisateur identifié n'existe pas.");
        }
        catch(PasLeDroitException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", e.toString());
        }
        catch(SQLException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Erreur de la base de données");
        }

        return forward;

    }

    private String analyse(HttpServletRequest request)
    {
        String forward = "VueAnalyse";

        try
        {
            request.setAttribute("analyses", Analyse.getToutesLesAnalyses());
        }

        catch(SQLException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Erreur de la base de données");
        }

        return forward;

    }

    private String enregistrerAnalyse(HttpServletRequest request)
    {
        String forward = null;

        String identifiant = (String) request.getParameter("identifiant");
        String commentaire = (String) request.getParameter("commentaire");

        try
        {
            Analyse.enregistrerNouvelleAnalyse(identifiant, commentaire);

            forward = analyse(request);
        }

        catch(SQLException e)
        {
            forward = "VueErreur";
            request.setAttribute("erreur", "Erreur de la base de données");
        }

        return forward;

    }

    private String erreur(HttpServletRequest request) {
        request.setAttribute("erreur", "Page inexistante.");
        return "VueErreur";
    }

}
